home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import os
- import sys
- import optparse
- import ibus
- import gobject
- import re
- patt = re.compile('<\\?.*\\?>\\n')
- from signal import signal, SIGTERM, SIGINT
- import factory
- import tabsqlitedb
-
- try:
- db_dir = os.path.join(os.getenv('IBUS_TABLE_LOCATION'), 'tables')
- icon_dir = os.path.join(os.getenv('IBUS_TABLE_LOCATION'), 'icons')
- except:
- db_dir = '/usr/share/ibus-table/tables'
- icon_dir = '/usr/share/ibus-table/icons'
-
- opt = optparse.OptionParser()
- opt.set_usage('%prog --table a_table.db')
- opt.add_option('--table', '-t', action = 'store', type = 'string', dest = 'db', default = '', help = 'Set the IME table file, default: %default')
- opt.add_option('--daemon', '-d', action = 'store_true', dest = 'daemon', default = False, help = 'Run as daemon, default: %default')
- opt.add_option('--ibus', '-i', action = 'store_true', dest = 'ibus', default = False, help = 'Set the IME icon file, default: %default')
- opt.add_option('--xml', '-x', action = 'store_true', dest = 'xml', default = False, help = 'output the engines xml part, default: %default')
- opt.add_option('--no-debug', '-n', action = 'store_false', dest = 'debug', default = True, help = 'redirect stdout and stderr to ~/.ibus/tables/debug.log, default: %default')
- (options, args) = opt.parse_args()
- if not (options.xml) and options.debug:
- if not os.access(os.path.expanduser('~/.ibus/tables'), os.F_OK):
- os.system('mkdir -p ~/.ibus/tables')
-
- logfile = os.path.expanduser('~/.ibus/tables/debug.log')
- sys.stdout = open(logfile, 'a', 0)
- sys.stderr = open(logfile, 'a', 0)
- from time import strftime
- print '--- ', strftime('%Y-%m-%d: %H:%M:%S'), ' ---'
-
-
- class IMApp:
-
- def __init__(self, dbfile, exec_by_ibus):
- self._IMApp__mainloop = gobject.MainLoop()
- self._IMApp__bus = ibus.Bus()
- self._IMApp__bus.connect('disconnected', self._IMApp__bus_destroy_cb)
- self._IMApp__factory = factory.EngineFactory(self._IMApp__bus, dbfile)
- if exec_by_ibus:
- self._IMApp__bus.request_name('org.freedesktop.IBus.Table', 0)
- else:
- self._IMApp__component = ibus.Component('org.freedesktop.IBus.Table', 'Table Component', '0.1.0', 'GPL', 'Yuwei Yu <acevery@gmail.com>')
- name = self._IMApp__factory.db.get_ime_property('name')
- longname = name
- description = self._IMApp__factory.db.get_ime_property('description')
- language = self._IMApp__factory.db.get_ime_property('languages')
- license = self._IMApp__factory.db.get_ime_property('credit')
- author = self._IMApp__factory.db.get_ime_property('author')
- icon = self._IMApp__factory.db.get_ime_property('icon')
- if icon:
- icon = os.path.join(icon_dir, icon)
- if not os.access(icon, os.F_OK):
- icon = ''
-
-
- layout = self._IMApp__factory.db.get_ime_property('layout')
- self._IMApp__component.add_engine(name, longname, description, language, license, author, icon, layout)
- self._IMApp__bus.register_component(self._IMApp__component)
-
-
- def run(self):
- self._IMApp__mainloop.run()
-
-
- def quit(self):
- self._IMApp__bus_destroy_cb()
-
-
- def __bus_destroy_cb(self, bus = None):
- self._IMApp__factory.do_destroy()
- self._IMApp__mainloop.quit()
-
-
-
- def cleanup(ima_ins):
- print 'cleanup'
- ima_ins.quit()
- sys.exit()
-
-
- def indent(elem, level = 0):
- '''Use to format xml Element pretty :)'''
- i = '\n' + level * ' '
- if len(elem):
- if not (elem.text) or not elem.text.strip():
- elem.text = i + ' '
-
- for e in elem:
- indent(e, level + 1)
- if not (e.tail) or not e.tail.strip():
- e.tail = i + ' '
- continue
-
- if not (e.tail) or not e.tail.strip():
- e.tail = i
-
- elif level:
- if not (elem.tail) or not elem.tail.strip():
- elem.tail = i
-
-
-
- def main():
- if options.xml:
- getdefaultlocale = getdefaultlocale
- import locale
- Element = Element
- SubElement = SubElement
- tostring = tostring
- import xml.etree.ElementTree
- dbs = os.listdir(db_dir)
- dbs = filter((lambda x: x.endswith('.db')), dbs)
- if not dbs:
- return None
- egs = Element('engines')
- for _db in dbs:
- _sq_db = tabsqlitedb.tabsqlitedb(os.path.join(db_dir, _db))
- _engine = SubElement(egs, 'engine')
- _name = SubElement(_engine, 'name')
- _name.text = _db.replace('.db', '')
- _longname = SubElement(_engine, 'longname')
- _locale = getdefaultlocale()[0].lower()
- _longname.text = _sq_db.get_ime_property('.'.join([
- 'name',
- _locale]))
- if not _longname.text:
- _longname.text = _name.text
-
- _language = SubElement(_engine, 'language')
- _langs = _sq_db.get_ime_property('languages')
- if _langs:
- _langs = _langs.split(',')
- if len(_langs) == 1:
- _language.text = _langs[0].strip()
- else:
- _language.text = _langs[0].strip().split('_')[0]
-
- _license = SubElement(_engine, 'license')
- _license.text = _sq_db.get_ime_property('license')
- _author = SubElement(_engine, 'author')
- _author.text = _sq_db.get_ime_property('author')
- _icon = SubElement(_engine, 'icon')
- _icon_basename = _sq_db.get_ime_property('icon')
- if _icon_basename:
- _icon.text = os.path.join(icon_dir, _icon_basename)
-
- _layout = SubElement(_engine, 'layout')
- _layout.text = _sq_db.get_ime_property('layout')
- _desc = SubElement(_engine, 'description')
- _desc.text = _sq_db.get_ime_property('description')
-
- indent(egs)
- egsout = tostring(egs, encoding = 'utf8')
- egsout = patt.sub('', egsout)
- print egsout
- return 0
- if options.daemon:
- if os.fork():
- sys.exit()
-
-
- if options.db:
- if os.access(options.db, os.F_OK):
- db = options.db
- else:
- db = '%s%s%s' % (db_dir, os.path.sep, os.path.basename(options.db))
- else:
- db = ''
- ima = IMApp(db, options.ibus)
- signal((SIGTERM,), (lambda signum, stack_frame: cleanup(ima)))
- signal((SIGINT,), (lambda signum, stack_frame: cleanup(ima)))
-
- try:
- ima.run()
- except KeyboardInterrupt:
- ima.quit()
-
-
- if __name__ == '__main__':
- main()
-
-